package com.itheima;

public class Maven高级 {
//    Maven高级------解决代码(模块)复用问题
    /*
    分模块

    什么是分模块设计?
    将项目按照功能拆分成若干个子模块

    为什么要分模块设计?
    将项目按照功能拆分成若干个子模块，方便项目的管理维护、扩展，也方便模块间的相互调用，资源共享。
    例如:创建maven模块 maven-pojo，存放原来AdvancedMaven中的pojo包,再将其作为依赖jar包导入原AdvancedMaven模块,项目照常运行
    <!--引入maven-pojo模块jar包-->
    <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>maven-pojo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    注意事项:
    分模块设计需要先针对模块功能进行设计，再进行编码。不会先将工程开发完毕，然后进行拆分
     */
    /**
     * maven模块继承关系
     *
     * 概念：maven继承描述的是两个工程(模块)间的关系，与java中的继承相似，子工程可以继承父工程中的配置信息，常见于依赖关系的继承。
     * 作用：简化依赖配置、统一管理依赖
     *
     * 例如:同一个项目的多个模块中都有lombok依赖项,此时可以定义一个父模块,让多个模块继承它,则只需要父模块中添加lombok依赖即可
     *
     *
     * 继承关系实现步骤:
     * ①. 创建maven模块 tlias-parent ，该工程为父工程，设置打包方式为pom(默认jar)。
     *
     *      Maven打包方式:
     *      jar：普通模块打包，springboot项目基本都是jar包（内嵌tomcat运行）
     *      war：普通web程序打包，需要部署在外部的tomcat服务器中运行
     *      pom：父工程或聚合工程，该模块不写代码，仅进行依赖管理,为子工程提供共同的 依赖项
     *
     *      父模块pom.xml中具体写法:
     *      <groupId>com.itheima</groupId>
     *      <artifactId>tlias-parent</artifactId>
     *      <version>1.0-SNAPSHOT</version>
     *      <packaging>pom</packaging><!--设置打包方式为pom-->
     *
     * ②. 在子工程的pom.xml文件中，配置继承关系。
     *
     *      子模块pom.xml中具体写法:
     *      <parent>
     *          <artifactId>tlias-parent</artifactId>
     *          <groupId>com.itheima</groupId>
     *          <version>1.0-SNAPSHOT</version>
     *          <relativePath>../tlias-parent/pom.xml</relativePath><!--relativePath指定父工程的pom文件的相对位置（如果不指定，将从本地仓库/远程仓库查找该工程）。../ 代表的上一级目录-->
     *      </parent>
     *
     *      <artifactId>tlias-child</artifactId>
     *      <version>1.0-SNAPSHOT</version><!--子模块可以省略版本号,默认跟随父模块,也可以指定自己的版本号-->
     *      <groupId>com.itheima</groupId><!--在子工程中，配置了继承关系之后，坐标中的groupId是可以省略的，因为会自动继承父工程的-->
     *
     * ③. 在父工程中配置各个工程共有的依赖（子工程会自动继承父工程的依赖）。
     * <dependencies>
     *     <dependency>
     *         <groupId>org.projectlombok</groupId>
     *         <artifactId>lombok</artifactId>
     *         <version>1.18.24</version><!--若父子工程都配置了同一个依赖的不同版本，以子工程的为准。-->
     *     </dependency>
     * </dependencies>
     *
     *此时，我们已经将各个子工程中共有的依赖（lombok），都定义在了父工程中，子工程中的这一项依赖，就可以直接删除了。删除之后，我们会看到父工程中配置的依赖 lombok，子工程直接继承下来了。
     * 多个不同子模块之间需要调用对方功能,只需要在自己的pom.xml文件依赖项中导入对方模块jar包坐标即可 ; 依赖可以传递,A依赖B,A依赖C,B依赖C,那么A只需要添加B的jar包即可
     *
     */
    /*
    版本锁定(父模块中统一管理子模块依赖版本)
    在maven中，可以在父模块的pom文件中通过 <dependencyManagement> 来统一管理子工程的依赖版本,dependencymanagement中的dependency并不会引入父工程自身中
    <dependencyManagement>
        <dependencies>
            <!--JWT令牌-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    子工程引入依赖时，无需指定 <version> 版本号，父工程统一管理。变更依赖版本，只需在父工程中统一变更。
    <dependencies>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>
    </dependencies>


    思考:父类中加不加<dependencyManagement>都可以统一指定子模块中的引用版本号,那么加与不加有什么区别?
    区别就是不使用<dependencyManagement>标签时,子模块中必定导入父模块中的依赖jar包,子模块没有选择权,而父模块<dependencyManagement>标签中的依赖jar包,子模块是可以有选择性的导入的,子模块中只会导入声明的jar包,无需写版本号,使用父模块的(同时父模块中也不会倒入该依赖jar包,因为父模块打包方式为pom,是不需要写代码的)

    这也是为什么SpringBoot项目pom文件中默认生成的依赖中没有指定<version>,因为模块继承了SpringBoot的模块,当中指定了各种与SpringBootjar包版本配套的依赖jar包的版本

    面试题：<dependencyManagement> 与 <dependencies>的区别是什么?
    <dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
    <dependencyManagement> 是统一管理依赖版本,子工程中不会直接依赖，还需要在子工程中写明所需引入的依赖(无需指定版本)
*/
/**
 mavne中自定义属性及属性引用(自定义变量)

 在pom文件中用
 <properties>
 <lombok.version>1.18.24</lombok.version>
 </properties>
 定义变量,在
 <dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>${lombok.version}</version>
 </dependency>
 version中引用变量

 实例:
 <properties>
 <maven.compiler.source>11</maven.compiler.source>
 <maven.compiler.target>11</maven.compiler.target>

 <lombok.version>1.18.24</lombok.version>
 <jjwt.version>0.9.1</jjwt.version>
 <aliyun.oss.version>3.15.1</aliyun.oss.version>
 <jaxb.version>2.3.1</jaxb.version>
 <activation.version>1.1.1</activation.version>
 <jaxb.runtime.version>2.3.3</jaxb.runtime.version>
 </properties>


 <dependencies>
 <dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>${lombok.version}</version>
 </dependency>
 </dependencies>

 <!--统一管理依赖版本-->
 <dependencyManagement>
 <dependencies>
 <!--JWT令牌-->
 <dependency>
 <groupId>io.jsonwebtoken</groupId>
 <artifactId>jjwt</artifactId>
 <version>${jjwt.version}</version>
 </dependency>

 <!--阿里云OSS-->
 <dependency>
 <groupId>com.aliyun.oss</groupId>
 <artifactId>aliyun-sdk-oss</artifactId>
 <version>${aliyun.oss.version}</version>
 </dependency>
 <dependency>
 <groupId>javax.xml.bind</groupId>
 <artifactId>jaxb-api</artifactId>
 <version>${jaxb.version}</version>
 </dependency>
 <dependency>
 <groupId>javax.activation</groupId>
 <artifactId>activation</artifactId>
 <version>${activation.version}</version>
 </dependency>
 <!-- no more than 2.3.3-->
 <dependency>
 <groupId>org.glassfish.jaxb</groupId>
 <artifactId>jaxb-runtime</artifactId>
 <version>${jaxb.runtime.version}</version>
 </dependency>
 </dependencies>
 </dependencyManagement>
 */
/*
maven模块聚合关系

聚合---将多个模块组织成一个整体，同时进行项目的构建。
聚合工程---一个不具有业务功能的“空”工程（有且仅有一个pom文件）,聚合工程通常就是父工程tlias-parent
作用---快速构建项目（无需根据依赖关系手动构建，直接在聚合工程上构建即可）

父工程（聚合工程）中可以通过 <modules> 设置当前聚合工程所包含的子模块名称
<!--聚合-->
<modules>
    <module>../tlias-pojo</module>
    <module>../tlias-utils</module>
    <module>../tlias-web-management</module>
</modules>

注意:聚合工程中所包含的模块，在构建时，会自动根据模块间的依赖关系设置构建顺序，与聚合工程中模块的配置书写位置无关。
 */
/**
 *继承与聚合总结
 *
 * 作用：
 * 聚合用于快速构建项目
 * 继承用于简化依赖配置、统一管理依赖
 *
 * 相同点：
 * 聚合与继承的pom.xml文件打包方式均为pom，可以将两种关系制作到同一个pom文件中(父模块聚合子模块,子模块继承父模块)
 * 聚合与继承均属于设计型模块，并无实际的模块内容
 *
 * 不同点：
 * 聚合是在聚合工程(父模块)中配置关系，聚合模块可以感知到参与聚合的模块有哪些
 * 继承是在子模块中配置关系，父模块无法感知哪些子模块继承了自己
 */
/*
maven仓库私服

私服是一种特殊的远程仓库，它是架设在局域网内的仓库服务，用来代理位于外部的中央仓库，用于解决团队内部的资源共享与资源同步问题。

依赖查找顺序：
本地仓库
私服
中央仓库

私服在企业项目开发中，一个项目/公司，只需要一台即可（无需我们自己搭建，会使用即可）。




项目版本：
RELEASE（发行版本）：功能趋于稳定、当前更新停止，可以用于发行的版本，存储在私服中的RELEASE仓库中。
SNAPSHOT（快照版本）：功能不稳定、尚处于开发中的版本，即快照版本，存储在私服的SNAPSHOT仓库中。
 */
}
